package com.atguigu.spring.ioc.config;

import com.atguigu.spring.ioc.bean.Person;
import com.atguigu.spring.ioc.condition.LinuxCondition;
import com.atguigu.spring.ioc.condition.WindowsCondition;
import org.springframework.context.annotation.*;

@Configuration // 告诉Spring容器,这是一个配置类
public class PersonConfig {
    /**
     * 不常用注册注解
     * @Condition 条件注册注解
     * 根据条件注册注解
     */

    @Conditional(WindowsCondition.class)
    @Bean("bill")
    public Person bill() {
        Person person = new Person();
        person.setAge(20);
        person.setGender("male");
        person.setName("Bill");
        return person;
    }

    @Conditional(LinuxCondition.class)
    @Bean("torvalds")
    public Person torvalds() {
        Person person = new Person();
        person.setAge(20);
        person.setGender("male");
        person.setName("Torvalds");
        return person;
    }
    /**
     * 不常用主键注解1
     * @Scope 调整组件的作用域,默认是单例的
     * 1. @Scope("prototype"),组件不是单例的,容器启动时不会创建对象
     * 2. @Scope("singleton"),组件是单例的
     * 3. @Scope("request"),组件在同一个请求是单例的,基本不用
     * 4. @Scope("session"),组件在同一个session是单例的,基本不用
     *
     * @Lazy 懒加载
     *      通常配合@Scope("singleton")使用,单例时第一次使用在创建对象,容器启动时并不创建对象
     */

    // 3. 给容器中注册一个自己的组件,方法名就是组件名
//    @Scope("singleton")
    @Bean("what'sup")
    public Person zhangsan() {
        Person person = new Person();
        person.setName("梦里青花");
        person.setAge(33);
        person.setGender("女");

        return person;
    }

    @Primary
    @Bean
    public Person dogdan() {
        Person person = new Person();
        person.setName("狗蛋");
        person.setAge(3);
        person.setGender("男");

        return person;
    }

//    // 组件名重复时,只取第一个声明的,其他的不存在,编译会报错
//    @Bean("what'sup")
//    public Person zhangsan2() {
//        Person person = new Person();
//        person.setName("梦里啥都有");
//        person.setAge(100);
//        person.setGender("男");
//        return person;
//    }
}
